package com.sprouting.personal.controller;

import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.sprouting.personal.interfaces.common.Constant;
import com.sprouting.personal.model.common.ResultJson;
import com.sprouting.personal.model.entity.Config;
import com.sprouting.personal.model.vo.PdfResource;
import com.sprouting.personal.service.ConfigService;
import com.sprouting.personal.utils.CheckTool;
import com.sprouting.personal.utils.NetTool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 在线预览PDF
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2023/7/1 23:03
 */
@RequestMapping("/pdf")
@Controller
@Slf4j
public class PdfController {

    @Autowired
    private ConfigService configService;

    @Value("${server.port}")
    private String port;



    /**
     * 获取可以看的pdf列表
     * @return
     */
    @ResponseBody
    @RequestMapping("/getPdfList")
    public ResultJson getPdfList(){
        Config config = configService.getConfigByCode(Constant.ConfigCode.PDF_PATH, Constant.DefaultValue.STRING);

        // 检查合法性
        String value = config.getValue();
        if (CheckTool.checkNull(value)){
            return ResultJson.error("未初始化PDF资源映射目录，请先前往默认配置中设置目录");
        }
        File file = new File(value);
        if (!file.exists()){
            return ResultJson.error("PDF资源映射目录文件夹路径错误或不存在");
        }
        if (!file.isDirectory()){
            return ResultJson.error("PDF资源映射目录不能是一个文件");
        }

        // 过滤配置，只读取指定后缀
        FileFilter fileFilter = pathname -> {
            String suffix = FileUtil.getSuffix(pathname);
            if (CheckTool.checkNull(suffix)){
                return false;
            }
            if ("pdf".equalsIgnoreCase(suffix)){
                return true;
            }
            return false;
        };

        List<File> fileList = FileUtil.loopFiles(file, fileFilter);
        List<PdfResource> pdfResourceList = new ArrayList<>();

        if (CollUtil.isNotEmpty(fileList)){
            for (File result : fileList){
                PdfResource pdfResource = new PdfResource();
                pdfResource.setName(FileUtil.getName(result));
                pdfResource.setPath(result.getPath());
                pdfResource.setLength(FileUtil.readableFileSize(result));
                pdfResourceList.add(pdfResource);
            }
        }

        return ResultJson.success(pdfResourceList);
    }

    /**
     * 读取pdf，返回数据流
     * @param path pdf路径
     */
    @GetMapping("readPdf")
    public void readPdf(String path, HttpServletResponse response) throws IOException {
        if (CheckTool.checkNull(path)){
            return;
        }

        if (!FileUtil.exist(path)){
            return;
        }

        response.getOutputStream().write(FileUtil.readBytes(path));
    }

    /**
     * 将当前页面的url获取到请求地址，生成二维码地址
     * 暂时有问题，该接口暂时不使用
     * @param dev 开发还是生产 dev 开发
     * @return
     */
    @PostMapping("/getPageUrl")
    @ResponseBody
    public ResultJson getPageUrl(String dev) {
        if (CheckTool.checkNull(dev)){
            dev = "dev";
        }

        String ip = NetTool.getLocalHostLANAddress();
        String server;
        if ("dev".equals(dev)){
            // 开发，如果还不能访问，需要考虑是否前端 设置的是 localhost，要修改为 0.0.0.0 或者 当前IP否则无法远程访问，如果发现访问进入页面但是报错，那则是前端没有设置正确IP的问题
            server = "http://" + ip + ":8083" + "/#/toPdfViewList";

        } else {
            // 生产
            server = "http://" + ip + ":" + port + "/index.html#/toPdfViewList";
        }

        log.info(server);
        // 二维码
        QrConfig config = new QrConfig(250, 250);
        // 设置边距，既二维码和背景之间的边距
        config.setMargin(3);
        String base64 = QrCodeUtil.generateAsBase64(server, config, ImgUtil.IMAGE_TYPE_PNG);
        return ResultJson.success(base64);
    }
}
